package com.englishtest.db.hibernate;

import java.io.Serializable;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import com.englishtest.base.EnglishtestException;

/**
 * <p>
 * Title: 封装操作数据库中数据的各种业务的工具类
 * </p>
 * 
 * <p>
 * Description: 封装操作数据库中数据的各种业务的工具类，它实现了org.springframework.context.ApplicationContextAware
 * 				接口，所有的方法都是静态的，其他类可以直接调用。
 * </p>
 * 
 * <p>
 * Copyright: Copyright 2008
 * </p>
 */
public class HibernateUtils implements ApplicationContextAware {

	/** HibernateUtils */
	private static HibernateUtils instance;

	/** IEnglishtestDao属性 */
	private IEnglishtestDao dao;
	
	/*public EnglishtestDaoSupport getDao(){
		return dao;
	}*/
	
	/**
	 * <p>
	 * Title: 设置应用的IEnglishtestDao实例，由Spring容器注入
	 * </p>
	 * 
	 * <p>
	 * Description: 设置应用的IEnglishtestDao实例，由Spring容器注入。
	 * </p>
	 * 
	 * @param dao IEnglishtestDao实例
	 */
	public void setDao(IEnglishtestDao dao){
		this.dao = dao;
	}

	/**
	 * <p>
	 * Title: 设置该对象运行的ApplicationContext
	 * </p>
	 * 
	 * <p>
	 * Description: 该方法继承自org.springframework.context.ApplicationContextAware接口，
	 * 				用于设置该对象运行的ApplicationContext。
	 * </p>
	 * 
	 * @param appContext 对象运行的ApplicationContext
	 */
	public void setApplicationContext(ApplicationContext appContext)
			throws BeansException {
		instance = this;
	}
	
	/**
	 * <p>
	 * Title: 获得org.hibernate.Session实例
	 * </p>
	 * 
	 * <p>
	 * Description: 该方法用于获得org.hibernate.Session实例。
	 * </p>
	 * 
	 * @return org.hibernate.Session实例
	 */
	public final static Session getSession() {
		if(instance != null && instance.dao != null)
			return instance.dao.getLocalSession();
		return null;
	}

	/**
	 * <p>
	 * Title: 将指定对象保存到数据库表中
	 * </p>
	 * 
	 * <p>
	 * Description: 该方法用于将指定对象保存到数据库表中。
	 * </p>
	 * 
	 * @param obj: 要保存的对象
	 * @return 给对象分配的标识符
	 */
	public final static void save(Object obj) throws EnglishtestException{
    	try{
    		if (instance != null && instance.dao != null)
    			instance.dao.save(obj);
    	} catch(HibernateException ex){
    		ex.printStackTrace();
    		throw new EnglishtestException("HibernateUtil.save raised a exception when"
    				+ "it attempt to save a instance of " + obj.getClass().getName());
    	}
	}
	
	/**
	 * <p>
	 * Title: 将指定对象更新到数据库表中
	 * </p>
	 * 
	 * <p>
	 * Description: 该方法用于将指定对象更新到数据库表中。
	 * </p>
	 * 
	 * @param obj: 要更新的对象
	 */
	public final static void update(Object obj) throws EnglishtestException{
    	try{
    		if (instance != null && instance.dao != null)
    			instance.dao.update(obj);
    	} catch(HibernateException ex) {
    		ex.printStackTrace();
    		throw new EnglishtestException("HibernateUtil.update raised a exception when"
    				+ "it attempt to update a instance of " + obj.getClass().getName());
    	}
	}
	
	/**
	 * <p>
	 * Title: 复制给定对象到具有相同标识符的持久化对象
	 * </p>
	 * 
	 * <p>
	 * Description: 该方法用于复制给定对象到具有相同标识符的持久化对象。
	 * </p>
	 * 
	 * @param obj: 给定对象
	 * @return 具有相同标识符的给定对象
	 */
	public final static void merge(Object obj) throws EnglishtestException{
    	try{
    		if (instance != null && instance.dao != null)
    			instance.dao.merge(obj);
    	} catch(HibernateException ex){
    		ex.printStackTrace();
    		throw new EnglishtestException("HibernateUtil.merge raised a exception when"
    				+ "it attempt to update a instance of " + obj.getClass().getName());
    	}
	}
	
	/**
	 * <p>
	 * Title: 将指定对象保存或更新到数据库表中
	 * </p>
	 * 
	 * <p>
	 * Description: 该方法用于将指定对象保存或更新到数据库表中。
	 * </p>
	 * 
	 * @param obj: 要保存或更新的对象
	 */
	public final static void saveOrUpdate(Object obj) throws EnglishtestException{
    	try{
    		if (instance != null && instance.dao != null)
    			instance.dao.saveOrUpdate(obj);
    	} catch(HibernateException ex){
    		ex.printStackTrace();
    		throw new EnglishtestException("HibernateUtil.saveOrUpdate raised a exception when"
    				+ "it attempt to save or update a instance of " + obj.getClass().getName());
    	}
	}
	
	/**
	 * <p>
	 * Title: 从数据库表中删除给定对象
	 * </p>
	 * 
	 * <p>
	 * Description: 该方法用于从数据库表中删除给定对象。
	 * </p>
	 * 
	 * @param obj: 要删除的对象
	 */
	public final static void delete(Object obj) throws EnglishtestException{
    	try{
    		if (instance != null && instance.dao != null)
    			instance.dao.delete(obj);
    	} catch(HibernateException ex){
    		ex.printStackTrace();
    		throw new EnglishtestException("HibernateUtil.delete raised a exception when"
    				+ "it attempt to delete a instance of " + obj.getClass().getName());
    	}
	}
	
	public final static Object get(Serializable id, Class clazz) throws EnglishtestException {
		try{
    		if (instance != null && instance.dao != null)
    			return instance.dao.get(id, clazz);
    	} catch(HibernateException ex){
    		ex.printStackTrace();
    		throw new EnglishtestException("HibernateUtil.get raised a exception when"
    				+ "it attempt to get a instance of " + clazz.getName() + " with id=" + String.valueOf(id));
    	}
    	return null;
	}
}
